package com.cb2.algorithm.leetcode;

/**
 * <a href='https://leetcode.cn/problems/maximum-score-after-splitting-a-string'>分割字符串的最大得分(Maximum Score After Splitting a String)</a>
 * <p>给你一个由若干 0 和 1 组成的字符串 s ，请你计算并返回将该字符串分割成两个 非空 子字符串（即 左 子字符串和 右 子字符串）所能获得的最大得分。</p>
 * <p>「分割字符串的得分」为 左 子字符串中 0 的数量加上 右 子字符串中 1 的数量。</p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 *  示例 1：
 *      输入：s = "011101"
 *      输出：5
 *      解释：
 *          将字符串 s 划分为两个非空子字符串的可行方案有：
 *          左子字符串 = "0" 且 右子字符串 = "11101"，得分 = 1 + 4 = 5
 *          左子字符串 = "01" 且 右子字符串 = "1101"，得分 = 1 + 3 = 4
 *          左子字符串 = "011" 且 右子字符串 = "101"，得分 = 1 + 2 = 3
 *          左子字符串 = "0111" 且 右子字符串 = "01"，得分 = 1 + 1 = 2
 *          左子字符串 = "01110" 且 右子字符串 = "1"，得分 = 2 + 1 = 3
 *
 *  示例 2：
 *      输入：s = "00111"
 *      输出：5
 *      解释：当 左子字符串 = "00" 且 右子字符串 = "111" 时，我们得到最大得分 = 2 + 3 = 5
 *
 *  示例 3：
 *      输入：s = "1111"
 *      输出：3
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>2 <= s.length <= 500</li>
 *     <li>字符串 s 仅由字符 '0' 和 '1' 组成。</li>
 * </ul>
 * </p>
 *
 * @author c2b
 * @since 2025/4/28 15:43
 */
public class LC1422MaximumScoreAfterSplittingString_S {

    static class Solution {
        public int maxScore(String s) {
            int n = s.length();
            int rightOne = 0;
            char[] chars = s.toCharArray();
            // 统计1出现的次数
            for (char c : chars) {
                rightOne += c - '0';
            }
            int res = 0;
            int leftZero = 0;
            for (int i = 0; i < n - 1; i++) {
                // 统计0 - i(包含i)出现的次数
                if (chars[i] == '0') {
                    leftZero++;
                } else {
                    rightOne--;
                }
                res = Math.max(res, leftZero + rightOne);
            }
            return res;
        }

        public int maxScore2(String s) {
            int n = s.length();
            char[] chars = s.toCharArray();
            // 统计1出现的次数
            int score = chars[0] == '0' ? 1 : 0;
            for (int i = 1; i < n; i++) {
                score += chars[i] - '0';
            }
            int res = score;
            for (int i = 1; i < n - 1; i++) {
                // 统计0 - i(包含i)出现的次数
                if (chars[i] == '0') {
                    score++;
                } else {
                    score--;
                }
                res = Math.max(res, score);
            }
            return res;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.maxScore("011101"));
        System.out.println(solution.maxScore("00111"));
        System.out.println(solution.maxScore("1111"));
    }
}
